package com.example.mysql.学习笔记.高级.事务.锁.锁的分类;

public class 从数据操作类型划分读写锁 {
}
/**
 * 3.1从数据操作的类型划分:读锁、写锁
 * 对于数据库中并发事务的读-读情况并不会引起什么问题。
 * 对于写-写、读-写 或写-读这些情况可能会引起一些
 * 问题，需要使用MVCC或者加锁的方式来解决它们。
 * 在使用加锁的方式解决问题时，由于既要允许读-读情况不受影响，
 * 又要使写-写、读-写或写-读情况中的操作相互阻塞，
 * 所以MySQL实现一个由两种类型的锁组成的锁系统来解决。
 * 这两种类型的锁通常被称为共享锁(Shared Lock, S Lock)和排他锁(Exclusive Lock, X Lock)，
 * 也叫读锁(read lock) 和写锁(write lock)。
 * ●读锁:也称为共享锁，英文用s表示。针对同-份数据，
 * 多个事务的读操作可以同时进行而不会互相影响，相互不阻塞的。
 * ● 写锁:也称为排他锁、英文用X表示。当前写操作没有完成前，它会阻断其他写锁和读锁。这样就能确保在
 * 给定的时间里，只有一个事务能执行写入，并防止其他用户读取正在写入的同-资源。
 *
 * 需要注意的是对于InnoDB引擎来说，读锁和写锁可以加在表上,也可以加在行上。
 * 总结:这里的兼容是指对同一张表或记录的锁的兼容性情况。
 *
 */
/**
 * 1.锁定读
 * 在采用加锁方式解决脏读、不可重复读、 幻读这些问题时，
 * 读取一条记录时需要获取该记录的S锁 ，其实是不严谨的，
 * 有时候需要在读取记录时就获取记录的X锁,来禁止别的事务读写该记录，
 * 为此MySQL提出了两种比较
 * 特殊的SELECT语句格式:
 * .对读取的记录加S锁: //共享锁
 *  SELECT ... LOCK IN SHARE MODE;//S锁 共享锁
 *  SELECT ...  FOR SHARE;//S锁 共享锁
 *  SELECT ...  FOR UPDATE;//X锁 排他锁
 *
 *
 */

/**
 *2.写操作
 * 平常所用到的写操作无非是 DELETE、UPDATE、 INSERT 这三种:
 * ●DELETE:
 * 对一条记录做DELETE操作的过程其实是先在B+树中定位到这条记录的位置，
 * 然后获取这条记录的X锁（排他锁），再执行delete mark 操作。
 * 我们也可以把这个定位待删除记录在B+树中位置的过程看成是一个获取 X锁的锁定读。
 * ●UPDATE: 在对-条记录做UPDATE操作时分为三种情况:
 *  。情况1:未修改该记录的键值，并且被更新的列占用的存储空间在修改前后未发生变化。
 *   则先在B+树中定位到这条记录的位置，然后再获取一下记录的X锁，最后在原记录的位置进行修改操作。
 *   我们也可以把这个定位待修改记录在B+树中位置的过程看成是一个获取X锁的锁定读。
 *  。情况2:未修改该记录的键值，并且至少有一个被更新的列占用的存储空间在修改前后发生变化。
 *  则先在B+树中定位到这条记录的位置，然后获取一下记录的 X锁,将该记录彻底删除掉(就是把记录彻
 *  底移入垃圾链表)，最后再插入-条新记录。这个定位待修改记录在B+树中位置的过程看成是一个获取 X
 *  锁的锁定读，新插入的记录由INSERT操作提供的  隐式锁  进行保护。
 *  。情况3:修改了该记录的键值，则相当于在原记录上做DELETE操作之后再来一次INSERT操作,
 *  加锁操作就需要按照DELETE和INSERT的规则进行了。
 * ●INSERT :  隐式锁
 *   一般情况下，新插入-条记录的操作并不加锁，通过-种称之为隐式锁的结构
 *   来保护这条新插入的记录在本事务提交前不被别的事务访问。
 *
 *
 */
